package com.ys.多线程.p1线程守护;

/**
 * 描述:
 * 场景：定义一个main线程，定义一个守护线程，用于守护main，一旦main运行完毕守护线程也就结束了。
 *  * 步骤：
 *  * 1 定义main线程
 *  * 2 模拟main线程运行需要5秒钟
 *  * 3 创建线程，将其设置为守护线程
 *  * 4 启动守护线程
 *
 * @author CodeYang
 * @version 2021/1/5 16:20
 */
public class P2守护主线程测试 {

    public static void main(String[] args) {
        System.out.println(Thread.currentThread().getName() + "---" + "start");

        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                // 守护线程的任务体，每隔1秒钟打印一次
                try {
                    for (int i = 0; true ; i++) {
                        System.out.println(Thread.currentThread().getName()+":::"+(i+1));

                            Thread.sleep(1000);

                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }
        },"守护线程-");
        // 将t1 设置未守护线程 必须在start之前 当正在运行的线程都是守护线程时，
        // Java虚拟机将退出。setDaemon(true)方法必须在启动线程前调用，否则抛出IllegalThreadStateException异常。   
        t1.setDaemon(true);
        t1.start();

        /**
         * 如果没有设置为守护线程,那么main线程结束了 该"守护线程也"没有结束
         * main---start
         * main:::end
         * 守护线程-:::1
         * 守护线程-:::2
         * 守护线程-:::3
         * 守护线程-:::4
         * ........
         */

        /**
         *  设置为守护线程后: 主线程结束,被守护的线程也就结束了
         *
         *  守护线程可以理解为把 你要守护的线程变为 当前线程的后台线程, 跟随当前线程的开始与销毁
         *  main---start
         * 守护线程-:::1
         * 守护线程-:::2
         * 守护线程-:::3
         * 守护线程-:::4
         * 守护线程-:::5
         * main:::end
         */
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName()+":::end");
    }
}
